"""统一的日志配置模块。

该模块提供统一的日志配置功能，支持：
- 文件日志（按日期轮转）
- 控制台日志
- 日志级别配置
- 日志格式自定义
"""

from __future__ import annotations

import logging
import logging.handlers
import sys
from pathlib import Path
from typing import Optional

from src.config import PROJECT_ROOT

# 日志文件目录
LOG_DIR = PROJECT_ROOT / "logs"
# 确保日志目录存在
LOG_DIR.mkdir(exist_ok=True)

# 日志文件路径
APP_LOG_FILE = LOG_DIR / "app.log"
AUDIT_LOG_FILE = LOG_DIR / "audit.log"

# 日志格式
DEFAULT_FORMAT = "%(asctime)s [%(levelname)-8s] %(name)s:%(lineno)d - %(message)s"
DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"

# 审计日志格式（更简洁，便于分析）
AUDIT_FORMAT = "%(asctime)s | %(levelname)-8s | %(message)s"


def setup_logging(
    *,
    level: int | str = logging.INFO,
    log_to_file: bool = True,
    log_to_console: bool = True,
    max_bytes: int = 10 * 1024 * 1024,  # 10MB
    backup_count: int = 5,
) -> None:
    """配置应用程序的日志系统。
    
    Args:
        level: 日志级别，可以是 logging.INFO、logging.DEBUG 等，或字符串 "INFO"、"DEBUG" 等
        log_to_file: 是否输出到文件
        log_to_console: 是否输出到控制台
        max_bytes: 单个日志文件最大大小（字节），超过后轮转
        backup_count: 保留的备份日志文件数量
    """
    # 解析日志级别
    if isinstance(level, str):
        level = getattr(logging, level.upper(), logging.INFO)
    
    # 获取根 logger
    root_logger = logging.getLogger()
    root_logger.setLevel(level)
    
    # 清除已有的处理器
    root_logger.handlers.clear()
    
    # 文件处理器（带轮转）
    if log_to_file:
        file_handler = logging.handlers.RotatingFileHandler(
            APP_LOG_FILE,
            maxBytes=max_bytes,
            backupCount=backup_count,
            encoding="utf-8",
        )
        file_handler.setLevel(level)
        file_formatter = logging.Formatter(DEFAULT_FORMAT, DEFAULT_DATE_FORMAT)
        file_handler.setFormatter(file_formatter)
        root_logger.addHandler(file_handler)
    
    # 控制台处理器
    if log_to_console:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(level)
        console_formatter = logging.Formatter(DEFAULT_FORMAT, DEFAULT_DATE_FORMAT)
        console_handler.setFormatter(console_formatter)
        root_logger.addHandler(console_handler)
    
    # 记录日志系统初始化
    logger = logging.getLogger(__name__)
    logger.info("日志系统已初始化，日志文件：%s", APP_LOG_FILE)


def get_logger(name: str) -> logging.Logger:
    """获取指定名称的 logger。
    
    Args:
        name: logger 名称，通常使用 __name__
        
    Returns:
        配置好的 logger 实例
    """
    return logging.getLogger(name)


def setup_audit_logging(
    *,
    level: int | str = logging.INFO,
    max_bytes: int = 10 * 1024 * 1024,  # 10MB
    backup_count: int = 10,  # 审计日志保留更多备份
) -> logging.Logger:
    """配置审计日志系统。
    
    审计日志用于记录关键操作，单独存储便于追踪和分析。
    
    Args:
        level: 日志级别
        max_bytes: 单个日志文件最大大小（字节）
        backup_count: 保留的备份日志文件数量
        
    Returns:
        审计专用的 logger 实例
    """
    # 解析日志级别
    if isinstance(level, str):
        level = getattr(logging, level.upper(), logging.INFO)
    
    # 创建审计专用的 logger
    audit_logger = logging.getLogger("audit")
    audit_logger.setLevel(level)
    
    # 防止日志传播到根 logger（避免重复记录）
    audit_logger.propagate = False
    
    # 文件处理器（带轮转）
    file_handler = logging.handlers.RotatingFileHandler(
        AUDIT_LOG_FILE,
        maxBytes=max_bytes,
        backupCount=backup_count,
        encoding="utf-8",
    )
    file_handler.setLevel(level)
    audit_formatter = logging.Formatter(AUDIT_FORMAT, DEFAULT_DATE_FORMAT)
    file_handler.setFormatter(audit_formatter)
    audit_logger.addHandler(file_handler)
    
    # 控制台也输出审计日志（便于开发调试）
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(level)
    console_formatter = logging.Formatter(AUDIT_FORMAT, DEFAULT_DATE_FORMAT)
    console_handler.setFormatter(console_formatter)
    audit_logger.addHandler(console_handler)
    
    audit_logger.info("审计日志系统已初始化，日志文件：%s", AUDIT_LOG_FILE)
    
    return audit_logger

